package sv.com.seguros.dao.asg;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;

import sv.com.seguros.dao.BaseDaoImpl;
import sv.com.seguros.exception.WebException;
import sv.com.seguros.web.controller.asg.AsgSeguroForm;
import sv.com.seguros.web.util.WebUtilidades;

public class AsgReporteDaoImpl extends BaseDaoImpl implements AsgReporteDao {

	@SuppressWarnings("unchecked")
	public List<Object[]> findVigenciaClientes(AsgSeguroForm asgSeguroForm) throws WebException{
		try {
			String hqlQuery = WebUtilidades.getQueryByName("asgReporte.vigenciaCliente");
			String where = "";
			boolean addAnd = false;
			List<Object> parameters = new ArrayList<Object>();
			if(asgSeguroForm.getCtgAseguradoraId() != null && asgSeguroForm.getCtgAseguradoraId() > 0){
				where += (addAnd ? " and " : "") + " ctgAseguradora.ctgAseguradoraId = ? ";
				parameters.add(asgSeguroForm.getCtgAseguradoraId());
				addAnd = true;
			}
			if((StringUtils.isNotBlank(asgSeguroForm.getAsgFechaInicio1()) && 
					StringUtils.isNotBlank(asgSeguroForm.getAsgFechaInicio2()))){
				where += (addAnd ? " and " : "") + " asgPoliza.asgPolizaFechaFinalizacion >= ? and  asgPoliza.asgPolizaFechaFinalizacion <= ? ";
				parameters.add(asgSeguroForm.getAsgFechaInicio1());
				parameters.add(asgSeguroForm.getAsgFechaInicio2());
				addAnd = true;
			}
			hqlQuery = StringUtils.replace(hqlQuery, "{WHERE}", StringUtils.isNotBlank(where) ? (" where " + where) : "");
			return (List<Object[]>) findByHQLQuery(hqlQuery, parameters.toArray());
		} catch (Exception e) {
			throw new WebException("Problemas al tratar de obtener la informaci\u00F3n");
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<Object[]> findAsegurados(AsgSeguroForm asgSeguroForm) throws WebException{
		try {
			String hqlQuery = WebUtilidades.getQueryByName("asgReporte.asegurados");
			String where = "";
			boolean addAnd = false;
			List<Object> parameters = new ArrayList<Object>();
			if(StringUtils.isNotBlank(asgSeguroForm.getAsgClienteNombreCompleto())){
				where += (addAnd ? " and " : "") +
					" (" +
					"	upper(" +
						"concat(" +
							"coalesce(asgCliente.asgClientePrimerNombre, ''), ' '," +
							"coalesce(asgCliente.asgClienteSegundoNombre, ''), ' '," +
							"coalesce(asgCliente.asgClienteTercerNombre, ''), ' '," +
							"coalesce(asgCliente.asgClientePrimerApellido, ''), ' '," +
							"coalesce(asgCliente.asgClienteSegundoApellido, ''), ' '," +
							"coalesce(asgCliente.asgClienteApellidoCasada, ''))) like upper(?) or" +
					"	upper(coalesce(asgCliente.asgClienteNombreComercial, '')) like upper(?)" +
					")";
				parameters.add("%" + StringUtils.replace(asgSeguroForm.getAsgClienteNombreCompleto(), " ", "%") + "%");
				parameters.add("%" + StringUtils.replace(asgSeguroForm.getAsgClienteNombreCompleto(), " ", "%") + "%");
				addAnd = true;
			}
			if(StringUtils.isNotBlank(asgSeguroForm.getAsgClienteDocumento1())){
				where += (addAnd ? " and " : "") + " asgCliente.asgClienteDocumento1 = ? ";
				parameters.add(asgSeguroForm.getAsgClienteDocumento1());
				addAnd = true;
			}
			if(StringUtils.isNotBlank(asgSeguroForm.getAsgClienteDocumento2())){
				where += (addAnd ? " and " : "") + " asgCliente.asgClienteDocumento2 = ? ";
				parameters.add(asgSeguroForm.getAsgClienteDocumento2());
				addAnd = true;
			}
			hqlQuery = StringUtils.replace(hqlQuery, "{WHERE}", StringUtils.isNotBlank(where) ? (" where " + where) : "");
			return (List<Object[]>) findByHQLQuery(hqlQuery, parameters.toArray());
		} catch (Exception e) {
			throw new WebException("Problemas al tratar de obtener la informaci\u00F3n");
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<Object[]> findAsesores(AsgSeguroForm asgSeguroForm) throws WebException{
		try {
			String hqlQuery = WebUtilidades.getQueryByName("asgReporte.asesores");
			String where = "";
			boolean addAnd = false;
			List<Object> parameters = new ArrayList<Object>();
			if(asgSeguroForm.getCtgAseguradoraId() != null && asgSeguroForm.getCtgAseguradoraId() > 0){
				where += (addAnd ? " and " : "") + " ctgAseguradora.ctgAseguradoraId = ? ";
				parameters.add(asgSeguroForm.getCtgAseguradoraId());
				addAnd = true;
			}
			if(asgSeguroForm.getCtgAsesorId() != null && asgSeguroForm.getCtgAsesorId() > 0){
				where += (addAnd ? " and " : "") + " ctgAsesor.ctgAsesorId = ? ";
				parameters.add(asgSeguroForm.getCtgAsesorId());
				addAnd = true;
			}
			hqlQuery = StringUtils.replace(hqlQuery, "{WHERE}", StringUtils.isNotBlank(where) ? (" where " + where) : "");
			return (List<Object[]>) findByHQLQuery(hqlQuery, parameters.toArray());
		} catch (Exception e) {
			throw new WebException("Problemas al tratar de obtener la informaci\u00F3n");
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<Object[]> findPolizasVendidas(AsgSeguroForm asgSeguroForm) throws WebException{
		try {
			String hqlQuery = WebUtilidades.getQueryByName("asgReporte.polizasVendidas");
			String where = "";
			boolean addAnd = false;
			List<Object> parameters = new ArrayList<Object>();
			if((StringUtils.isNotBlank(asgSeguroForm.getAsgFechaInicio1()) && 
					StringUtils.isNotBlank(asgSeguroForm.getAsgFechaInicio2()))){
				where += (addAnd ? " and " : "") + " asgPoliza.asgPolizaFechaInicio >= ? and  asgPoliza.asgPolizaFechaInicio <= ? ";
				parameters.add(asgSeguroForm.getAsgFechaInicio1());
				parameters.add(asgSeguroForm.getAsgFechaInicio2());
				addAnd = true;
			}
			hqlQuery = StringUtils.replace(hqlQuery, "{WHERE}", StringUtils.isNotBlank(where) ? (" where " + where) : "");
			return (List<Object[]>) findByHQLQuery(hqlQuery, parameters.toArray());
		} catch (Exception e) {
			throw new WebException("Problemas al tratar de obtener la informaci\u00F3n");
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<Object[]> findPolizasPorCliente(AsgSeguroForm asgSeguroForm) throws WebException{
		try {
			String hqlQuery = WebUtilidades.getQueryByName("asgReporte.polizasPorCliente");
			String where = "";
			boolean addAnd = false;
			List<Object> parameters = new ArrayList<Object>();
			if(StringUtils.isNotBlank(asgSeguroForm.getAsgClienteNombreCompleto())){
				where += (addAnd ? " and " : "") +
					" (" +
					"	upper(" +
						"concat(" +
							"coalesce(asgCliente.asgClientePrimerNombre, ''), ' '," +
							"coalesce(asgCliente.asgClienteSegundoNombre, ''), ' '," +
							"coalesce(asgCliente.asgClienteTercerNombre, ''), ' '," +
							"coalesce(asgCliente.asgClientePrimerApellido, ''), ' '," +
							"coalesce(asgCliente.asgClienteSegundoApellido, ''), ' '," +
							"coalesce(asgCliente.asgClienteApellidoCasada, ''))) like upper(?) or" +
					"	upper(coalesce(asgCliente.asgClienteNombreComercial, '')) like upper(?)" +
					")";
				parameters.add("%" + StringUtils.replace(asgSeguroForm.getAsgClienteNombreCompleto(), " ", "%") + "%");
				parameters.add("%" + StringUtils.replace(asgSeguroForm.getAsgClienteNombreCompleto(), " ", "%") + "%");
				addAnd = true;
			}
			if(StringUtils.isNotBlank(asgSeguroForm.getAsgClienteDocumento1())){
				where += (addAnd ? " and " : "") + " asgCliente.asgClienteDocumento1 = ? ";
				parameters.add(asgSeguroForm.getAsgClienteDocumento1());
				addAnd = true;
			}
			if(StringUtils.isNotBlank(asgSeguroForm.getAsgClienteDocumento2())){
				where += (addAnd ? " and " : "") + " asgCliente.asgClienteDocumento2 = ? ";
				parameters.add(asgSeguroForm.getAsgClienteDocumento2());
				addAnd = true;
			}
			if((StringUtils.isNotBlank(asgSeguroForm.getAsgFechaInicio1()) && 
					StringUtils.isNotBlank(asgSeguroForm.getAsgFechaInicio2()))){
				where += (addAnd ? " and " : "") + " asgPoliza.asgPolizaFechaInicio >= ? and  asgPoliza.asgPolizaFechaInicio <= ? ";
				parameters.add(asgSeguroForm.getAsgFechaInicio1());
				parameters.add(asgSeguroForm.getAsgFechaInicio2());
				addAnd = true;
			}
			hqlQuery = StringUtils.replace(hqlQuery, "{WHERE}", StringUtils.isNotBlank(where) ? (" where " + where) : "");
			return (List<Object[]>) findByHQLQuery(hqlQuery, parameters.toArray());
		} catch (Exception e) {
			throw new WebException("Problemas al tratar de obtener la informaci\u00F3n");
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<Object[]> findPolizasPorAsesor(AsgSeguroForm asgSeguroForm) throws WebException{
		try {
			String hqlQuery = WebUtilidades.getQueryByName("asgReporte.polizasPorAsesor");
			String where = "";
			boolean addAnd = false;
			List<Object> parameters = new ArrayList<Object>();
			if(asgSeguroForm.getCtgAseguradoraId() != null && asgSeguroForm.getCtgAseguradoraId() > 0){
				where += (addAnd ? " and " : "") + " ctgAseguradora.ctgAseguradoraId = ? ";
				parameters.add(asgSeguroForm.getCtgAseguradoraId());
				addAnd = true;
			}
			if(asgSeguroForm.getCtgAsesorId() != null && asgSeguroForm.getCtgAsesorId() > 0){
				where += (addAnd ? " and " : "") + " ctgAsesor.ctgAsesorId = ? ";
				parameters.add(asgSeguroForm.getCtgAsesorId());
				addAnd = true;
			}
			if((StringUtils.isNotBlank(asgSeguroForm.getAsgFechaInicio1()) && 
					StringUtils.isNotBlank(asgSeguroForm.getAsgFechaInicio2()))){
				where += (addAnd ? " and " : "") + " asgPoliza.asgPolizaFechaInicio >= ? and  asgPoliza.asgPolizaFechaInicio <= ? ";
				parameters.add(asgSeguroForm.getAsgFechaInicio1());
				parameters.add(asgSeguroForm.getAsgFechaInicio2());
				addAnd = true;
			}
			hqlQuery = StringUtils.replace(hqlQuery, "{WHERE}", StringUtils.isNotBlank(where) ? (" where " + where) : "");
			return (List<Object[]>) findByHQLQuery(hqlQuery, parameters.toArray());
		} catch (Exception e) {
			throw new WebException("Problemas al tratar de obtener la informaci\u00F3n");
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<Object[]> findReclamos(AsgSeguroForm asgSeguroForm) throws WebException{
		try {
			String hqlQuery = WebUtilidades.getQueryByName("asgReporte.reclamos");
			String where = "";
			boolean addAnd = true;
			List<Object> parameters = new ArrayList<Object>();
			if(StringUtils.isNotBlank(asgSeguroForm.getAsgClienteNombreCompleto())){
				where += (addAnd ? " and " : "") +
					" (" +
					"	upper(" +
						"concat(" +
							"coalesce(asgCliente.asgClientePrimerNombre, ''), ' '," +
							"coalesce(asgCliente.asgClienteSegundoNombre, ''), ' '," +
							"coalesce(asgCliente.asgClienteTercerNombre, ''), ' '," +
							"coalesce(asgCliente.asgClientePrimerApellido, ''), ' '," +
							"coalesce(asgCliente.asgClienteSegundoApellido, ''), ' '," +
							"coalesce(asgCliente.asgClienteApellidoCasada, ''))) like upper(?) or" +
					"	upper(coalesce(asgCliente.asgClienteNombreComercial, '')) like upper(?)" +
					")";
				parameters.add("%" + StringUtils.replace(asgSeguroForm.getAsgClienteNombreCompleto(), " ", "%") + "%");
				parameters.add("%" + StringUtils.replace(asgSeguroForm.getAsgClienteNombreCompleto(), " ", "%") + "%");
				addAnd = true;
			}
			if(StringUtils.isNotBlank(asgSeguroForm.getAsgPolizaNumero())){
				where += (addAnd ? " and " : "") + " asgPoliza.asgPolizaNumero like upper(?) ";
				parameters.add("%" + asgSeguroForm.getAsgPolizaNumero() + "%");
				addAnd = true;
			}
			if(StringUtils.isNotBlank(asgSeguroForm.getAsgResponsable())){
				where += (addAnd ? " and " : "") + " asgReclamo.asgReclamoResponsable like upper(?) ";
				parameters.add("%" + asgSeguroForm.getAsgResponsable() + "%");
				addAnd = true;
			}
			if((StringUtils.isNotBlank(asgSeguroForm.getAsgFechaInicio1()) && 
					StringUtils.isNotBlank(asgSeguroForm.getAsgFechaInicio2()))){
				where += (addAnd ? " and " : "") + " asgSeguimiento.asgSeguimientoFechaSiguiente >= ? and  asgSeguimiento.asgSeguimientoFechaSiguiente <= ? ";
				parameters.add(asgSeguroForm.getAsgFechaInicio1());
				parameters.add(asgSeguroForm.getAsgFechaInicio2());
				addAnd = true;
			}
			hqlQuery = StringUtils.replace(hqlQuery, "{WHERE}", StringUtils.isNotBlank(where) ? (where) : "");
			return (List<Object[]>) findByHQLQuery(hqlQuery, parameters.toArray());
		} catch (Exception e) {
			throw new WebException("Problemas al tratar de obtener la informaci\u00F3n");
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<Object[]> findPendientes(AsgSeguroForm asgSeguroForm) throws WebException{
		try {
			String hqlQuery = WebUtilidades.getQueryByName("asgReporte.pendientes");
			String where = "";
			boolean addAnd = true;
			List<Object> parameters = new ArrayList<Object>();
			if(StringUtils.isNotBlank(asgSeguroForm.getAsgClienteNombreCompleto())){
				where += (addAnd ? " and " : "") +
					" (" +
					"	upper(" +
						"concat(" +
							"coalesce(asgCliente.asgClientePrimerNombre, ''), ' '," +
							"coalesce(asgCliente.asgClienteSegundoNombre, ''), ' '," +
							"coalesce(asgCliente.asgClienteTercerNombre, ''), ' '," +
							"coalesce(asgCliente.asgClientePrimerApellido, ''), ' '," +
							"coalesce(asgCliente.asgClienteSegundoApellido, ''), ' '," +
							"coalesce(asgCliente.asgClienteApellidoCasada, ''))) like upper(?) or" +
					"	upper(coalesce(asgCliente.asgClienteNombreComercial, '')) like upper(?)" +
					")";
				parameters.add("%" + StringUtils.replace(asgSeguroForm.getAsgClienteNombreCompleto(), " ", "%") + "%");
				parameters.add("%" + StringUtils.replace(asgSeguroForm.getAsgClienteNombreCompleto(), " ", "%") + "%");
				addAnd = true;
			}
			if(StringUtils.isNotBlank(asgSeguroForm.getAsgPolizaNumero())){
				where += (addAnd ? " and " : "") + " asgPoliza.asgPolizaNumero like upper(?) ";
				parameters.add("%" + asgSeguroForm.getAsgPolizaNumero() + "%");
				addAnd = true;
			}
			if(StringUtils.isNotBlank(asgSeguroForm.getAsgResponsable())){
				where += (addAnd ? " and " : "") + " asgPendiente.asgPendienteResponsable like upper(?) ";
				parameters.add("%" + asgSeguroForm.getAsgResponsable() + "%");
				addAnd = true;
			}
			if((StringUtils.isNotBlank(asgSeguroForm.getAsgFechaInicio1()) && 
					StringUtils.isNotBlank(asgSeguroForm.getAsgFechaInicio2()))){
				where += (addAnd ? " and " : "") + " asgSeguimiento.asgSeguimientoFechaSiguiente >= ? and  asgSeguimiento.asgSeguimientoFechaSiguiente <= ? ";
				parameters.add(asgSeguroForm.getAsgFechaInicio1());
				parameters.add(asgSeguroForm.getAsgFechaInicio2());
				addAnd = true;
			}
			hqlQuery = StringUtils.replace(hqlQuery, "{WHERE}", StringUtils.isNotBlank(where) ? (where) : "");
			return (List<Object[]>) findByHQLQuery(hqlQuery, parameters.toArray());
		} catch (Exception e) {
			throw new WebException("Problemas al tratar de obtener la informaci\u00F3n");
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<Object[]> findVentas(AsgSeguroForm asgSeguroForm) throws WebException{
		try {
			String hqlQuery = WebUtilidades.getQueryByName("asgReporte.ventas");
			String where = "";
			boolean addAnd = true;
			List<Object> parameters = new ArrayList<Object>();
			if(StringUtils.isNotBlank(asgSeguroForm.getAsgClienteNombreCompleto())){
				where += (addAnd ? " and " : "") +
					" upper(" +
						"concat(" +
						"	coalesce(asgVenta.asgVentaPrimerNombre, ''), ' '," +
						"	coalesce(asgVenta.asgVentaSegundoNombre, ''), ' '," +
						"	coalesce(asgVenta.asgVentaTercerNombre, ''), ' '," +
						"	coalesce(asgVenta.asgVentaPrimerApellido, ''), ' '," +
						"	coalesce(asgVenta.asgVentaSegundoApellido, ''), ' '," +
						"	coalesce(asgVenta.asgVentaApellidoCasada, ''))) like upper(?) ";
				parameters.add("%" + StringUtils.replace(asgSeguroForm.getAsgClienteNombreCompleto(), " ", "%") + "%");
				addAnd = true;
			}
			if(StringUtils.isNotBlank(asgSeguroForm.getAsgResponsable())){
				where += (addAnd ? " and " : "") + " asgVenta.asgVentaResponsable like upper(?) ";
				parameters.add("%" + asgSeguroForm.getAsgResponsable() + "%");
				addAnd = true;
			}
			if((StringUtils.isNotBlank(asgSeguroForm.getAsgFechaInicio1()) && 
					StringUtils.isNotBlank(asgSeguroForm.getAsgFechaInicio2()))){
				where += (addAnd ? " and " : "") + " asgSeguimiento.asgSeguimientoFechaSiguiente >= ? and  asgSeguimiento.asgSeguimientoFechaSiguiente <= ? ";
				parameters.add(asgSeguroForm.getAsgFechaInicio1());
				parameters.add(asgSeguroForm.getAsgFechaInicio2());
				addAnd = true;
			}
			hqlQuery = StringUtils.replace(hqlQuery, "{WHERE}", StringUtils.isNotBlank(where) ? (where) : "");
			return (List<Object[]>) findByHQLQuery(hqlQuery, parameters.toArray());
		} catch (Exception e) {
			throw new WebException("Problemas al tratar de obtener la informaci\u00F3n");
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<Object[]> findAbonos(AsgSeguroForm asgSeguroForm) throws WebException{
		try {
			String hqlQuery = WebUtilidades.getQueryByName("asgReporte.abonos");
			String where = "";
			boolean addAnd = false;
			List<Object> parameters = new ArrayList<Object>();
			if(StringUtils.isNotBlank(asgSeguroForm.getAsgClienteNombreCompleto())){
				where += (addAnd ? " and " : "") +
					" (" +
					"	upper(" +
						"concat(" +
							"coalesce(asgCliente.asgClientePrimerNombre, ''), ' '," +
							"coalesce(asgCliente.asgClienteSegundoNombre, ''), ' '," +
							"coalesce(asgCliente.asgClienteTercerNombre, ''), ' '," +
							"coalesce(asgCliente.asgClientePrimerApellido, ''), ' '," +
							"coalesce(asgCliente.asgClienteSegundoApellido, ''), ' '," +
							"coalesce(asgCliente.asgClienteApellidoCasada, ''))) like upper(?) or" +
					"	upper(coalesce(asgCliente.asgClienteNombreComercial, '')) like upper(?)" +
					")";
				parameters.add("%" + StringUtils.replace(asgSeguroForm.getAsgClienteNombreCompleto(), " ", "%") + "%");
				parameters.add("%" + StringUtils.replace(asgSeguroForm.getAsgClienteNombreCompleto(), " ", "%") + "%");
				addAnd = true;
			}
			if(StringUtils.isNotBlank(asgSeguroForm.getAsgPolizaNumero())){
				where += (addAnd ? " and " : "") + " asgPoliza.asgPolizaNumero like upper(?) ";
				parameters.add("%" + asgSeguroForm.getAsgPolizaNumero() + "%");
				addAnd = true;
			}
			if((StringUtils.isNotBlank(asgSeguroForm.getAsgFechaInicio1()) && 
					StringUtils.isNotBlank(asgSeguroForm.getAsgFechaInicio2()))){
				where += (addAnd ? " and " : "") + " asgAbono.asgAbonoFechaLimite >= ? and  asgAbono.asgAbonoFechaLimite <= ? ";
				parameters.add(asgSeguroForm.getAsgFechaInicio1());
				parameters.add(asgSeguroForm.getAsgFechaInicio2());
				addAnd = true;
			}
			hqlQuery = StringUtils.replace(hqlQuery, "{WHERE}", StringUtils.isNotBlank(where) ? (" where " + where) : "");
			return (List<Object[]>) findByHQLQuery(hqlQuery, parameters.toArray());
		} catch (Exception e) {
			throw new WebException("Problemas al tratar de obtener la informaci\u00F3n");
		}
	}
	
}
